package com.sinosoft.cloud.access.abc.codec;

import com.sinosoft.cloud.access.annotations.AccessCoder;
import com.sinosoft.cloud.access.codec.CoderBean;

/**
 * cloud-netty
 *
 * @title: cloud-netty
 * @package: com.sinosoft.cloud.access.abc.codec
 * @author: yangming
 * @date: 2017/12/2 下午3:29
 */
@AccessCoder(name = "abc")
public class AbcDcoder extends CoderBean {

    private final static String ENCODER_FORMAT = "X1.000000000    111821000                                       000000000";

    /**
     * 农银报文头格式:
     * 字段              长度              说明
     * -----------------------------------
     * 报文类型                C1              固定为“X”，表示标准接口
     * 版本号              C3             当前版本为1.0
     * 数据包长度           N8             包体的长度，包体的长度不能超过50K字节。如果加密，指加密后的长度；如果压缩，指定压缩后的长度。
     * 公司代码                C8              银行分配给公司的代码：
     * 加密标示                C1              数据包是否加密：0-不加密；1-关键数据加密；2-报文整体加密。
     * 加密算法                C1
     * 数据压缩标志              C1              数据包是否压缩传输：0-不压缩；1-压缩
     * 数据压缩算法              C1
     * 摘要算法                C1
     * 摘要              C40
     * 预留字段                C8              扩展域，固定值00000000
     *
     * @param msg
     * @return Integer
     */
    @Override
    public Integer getHeadSize(String msg) {
        return 73;
    }

    @Override
    public Integer getBodySize(String msg) {
        if (msg != null && msg.length() > 0) {
            String strSize = msg.substring(4, 12);
            return Integer.parseInt(strSize.trim());
        }
        return 0;
    }

    @Override
    public String encoder(String msg) {
        int size = msg.getBytes().length;
        logger.info("返回报文体的长度："+size);
        String strSize = String.valueOf(size);
        StringBuilder stringBuilder = new StringBuilder(ENCODER_FORMAT);
//        StringBuilder x = stringBuilder.replace(4, 4 + strSize.getBytes().length, strSize).append(msg);
        StringBuilder x = stringBuilder.replace(12-strSize.getBytes().length, 12, strSize).append(msg);
        logger.info("返回报文预期长度："+x.toString().substring(4,12));
        return x.toString();
    }
}
